﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <cstdlib>
using namespace std;

class A
{
	private:
	static int _k;
	int _h = 1;
public:
	class B // B默认就是A的友元
	{
	public :
		void foo(const A& a)
		{
			cout << _k << endl; //OK
			cout << a._h << endl; //OK
		}
	};
};
int A::_k = 1;
int main()
{
	cout << sizeof(A) << endl;
	A::B b;
	A aa;
	b.foo(aa);
	return 0;
}

//class A
//{
//	// 友元声明
//	friend class B;
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//class B
//{ 
//public :
//	void func1(const A & aa)
//	{
//	cout << aa._a1 << endl;//1
//	cout << _b1 << endl;//3
//	} 
//	void func2(const A & aa)
//	{
//	cout << aa._a2 << endl;//2
//	cout << _b2 << endl;//4
//	}
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//int main()
//{
//	A aa;
//	B bb;
//	bb.func1(aa);
//	bb.func2(aa);
//	return 0;
//}
//class A
//{
//public:
//	A()
//	{
//		cout << "A" << endl;
//	}
//	~A()
//	{
//		cout << "~A" << endl;
//	}
//};
//class B
//{
//public:
//	B()
//	{
//		cout << "B" << endl;
//	}
//	~B()
//	{
//		cout << "~B" << endl;
//	}
//};
//class C
//{
//public:
//	C()
//	{
//		cout << "C" << endl;
//	}
//	~C()
//	{
//		cout << "~C" << endl;
//	}
//};
//class D
//{
//public:
//	D()
//	{
//		cout << "D" << endl;
//	}
//	~D()
//	{
//		cout << "~D" << endl;
//	}
//};
//
//C c;
//int main()
//{
//	A a;
//	B b;
//	static D d;
//	return 0;
//}
//class A
//{
//public :
//	A()
//	{
//		++_scount;
//	} 
//	A(const A& t)
//	{
//		++_scount;
//	} 
//	~A()
//	{
//		--_scount;
//	} 
//	static int GetACount()
//	{
//		return _scount;
//	}
//private:
//	// 类⾥⾯声明
//	static int _scount;
//};
//// 类外⾯初始化
//int A::_scount = 0;
//int main()
//{
//	cout << A::GetACount() << endl;//0
//	A a1, a2;
//	A a3(a1);
//	cout << A::GetACount() << endl;//3
//	cout << a1.GetACount() << endl;//3
//	// 编译报错：error C2248: “A::_scount”: ⽆法访问 private 成员(在“A”类中声明)
//	//cout << A::_scount << endl;
//	return 0;
//}

//class Time
//{
//public :
//	Time(int hour)
//		: _hour(hour)
//	{
//		cout << "Time()" << endl;
//	}
//private:
//	int _hour;
//};
//class Date
//{
//public:
//	Date()
//		: _month(2)
//	{
//		cout << "Date()" << endl;
//	}
//	void Print() const
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//private:
//	// 注意这⾥不是初始化，这⾥给的是缺省值，这个缺省值是给初始化列表的
//	// 如果初始化列表没有显⽰初始化，默认就会⽤这个缺省值初始化
//	int _year = 1;
//	int _month = 1;
//	int _day;
//	Time _t = 1;
//	const int _n = 1;
//	int* _ptr = (int*)malloc(12);
//};
//int main()
//{
//	Date d1;
//	d1.Print();
//	return 0;
//}
//class Date
//{
//public:
//	Date(int& x, int year = 1, int month = 1, int day = 1)
//		: _year(year)
//		, _month(month)
//		, _day(day)
//		, _t(12)
//		, _ref(x)
//		, _n(1)
//	{
//		// error C2512: “Time”: 没有合适的默认构造函数可⽤
//		// error C2530 : “Date::_ref” : 必须初始化引⽤
//		// error C2789 : “Date::_n” : 必须初始化常量限定类型的对象
//	}
//	void Print() const
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//	Time _t; // 没有默认构造
//	int& _ref; // 引⽤
//	const int _n; // const
//};
//int main()
//{
//	int i = 0;
//	Date d1(i);
//	d1.Print();
//	return 0;
//}

////////////////////////////////////////////////////////////////////////////
//日期类实现
//class Date
//{
//	//友元函数
//	friend ostream& operator<<(ostream& out, const Date& d);
//	friend istream& operator>>(istream& in, Date& d);
//public:
//	//构造
//	Date(int year=1,int month=1,int day=1)
//	{
//		//cout << "Date(int year=1,int month=1,int day=1)" << endl;
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	//拷贝构造
//	Date(const Date& d)
//	{
//		//cout << "Date(const Date& d)" << endl;
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//	//赋值运算符重载
//	Date& operator=(const Date& d)
//	{
//		//cout << "Date& (const Date& d)" << endl;
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//		return *this;
//	}
//	~Date(){}
//	//获取天数
//	int GetMonthDay(int year, int month)
//	{
//		static int array[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
//		//判断是否为瑞年
//		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
//			return 29;
//		return array[month];
//	}
//	//逻辑判断---比大小
//	bool operator==(const Date& d1)const
//	{
//		return _year == d1._year && _month == d1._month && _day == d1._day;
//	}
//	bool operator<(const Date& d) const
//	{
//		return !(*this >= d);
//	}
//	bool operator<=(const Date& d) const
//	{
//		return !(*this > d);
//	}
//	bool operator>(const Date& d) const
//	{
//		if (_year > d._year)
//			return true;
//		else if (_year == d._year)
//		{
//			if (_month > d._month)
//				return true;
//			else if (_month == d._month)
//			{
//				if (_day > d._day)
//					return true;
//			}
//		}
//		return false;
//	}
//	bool operator>=(const Date& d) const
//	{
//		return *this == d || *this > d;
//	}
//	bool operator!=(const Date& d) const
//	{
//		return !(*this == d);
//	}
//
//	int operator-(const Date& d)const//计算2个日期相差多少天
//	{
//		int day = 0;
//		Date tmp_max = *this, tmp_min = d;
//		if (d > *this)
//		{
//			tmp_max = d;
//			tmp_min = *this;
//		}
//		while (tmp_min != tmp_max)
//		{
//			day++;
//			++tmp_min;
//		}
//		return day;
//	}
//
//	Date& operator++()//前置++
//	{
//		return *this += 1;
//	}
//	Date operator++(int)//后置++
//	{
//		Date tmp = *this;
//		*this += 1;
//		return tmp;
//	}
//	Date& operator--()//前置--
//	{
//		return *this -= 1;
//	}
//	Date operator--(int)//后置--
//	{
//		Date tmp = *this;
//		*this -= 1;
//		return tmp;
//	}
//	// d1 += 天数
//	Date& operator+=(int day)
//	{
//		_day += day;
//		while (_day > GetMonthDay(_year, _month))
//		{
//			_day -= GetMonthDay(_year, _month);
//			_month++;
//			if (_month == 13)
//			{
//				_month = 1;
//				_year++;
//			}
//		}
//		return *this;
//	}
//	Date operator+(int day) const
//	{
//		Date tmp = *this;
//		tmp += day;
//		return tmp;
//	}
//	// d1 -= 天数
//	Date& operator-=(int day)
//	{
//		_day -= day;
//		while (_day < 1)
//		{
//			--_month;
//			if (_month == 0)
//			{
//				_month = 12;
//				_year--;
//			}
//			_day += GetMonthDay(_year, _month);
//		}
//		return *this;
//	}
//	Date operator-(int day) const
//	{
//		Date tmp = *this;
//		tmp -= day;
//		return tmp;
//	}
//	bool check()//检查日期是否合法
//	{
//		if(_month>12||_month<1||_day<1||_day>GetMonthDay(_year,_month))
//			return false;
//		return true;
//	}
//	void Print()
//	{
//		cout << _year << '-' << _month << '-' << _day << endl;
//	}
//private:
//	//只是声明
//	int _year;
//	int _month;
//	int _day;
//};
//
////运算符重载输入、输出
//ostream& operator<<(ostream& out, const Date& d)
//{
//	out << d._year << '-' << d._month << '-' << d._day << endl;
//	return out;
//}
//
//istream& operator>>(istream& in, Date& d)
//{
//	cout << "请依次输入年月日：";
//	in >> d._year >> d._month >> d._day;
//	if (!d.check())
//	{
//		cout << "日期非法" << endl;
//	}
//	return in;
//}
//int main()
//{
//	Date d1(2025, 2, 27);
//	Date d2(2025, 9, 25);
//	/*int day = d2 - d1;
//	cout << day;*/
//	//d1 -= 100;
//	//cout << d1+100;
//	cout << d1--;
//	return 0;
//}
///////////////////////////////////////////////////////////////////////////

//void f(int x)
//{
//	cout << "f(int x)" << endl;
//} 
//void f(int* ptr)
//{
//	cout << "f(int* ptr)" << endl;
//} 
//int main()
//{
//	f(0);
//	// 本想通过f(NULL)调⽤指针版本的f(int*)函数，但是由于NULL被定义成0，调⽤了f(intx)，因此与程序的初衷相悖。
//	f(NULL);
//	f((int*)NULL);
//	// 编译报错：error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型
//	// f((void*)NULL);
//	f(nullptr);
//	return 0;
//}
//int main()
//{
//	//const int a = 10;
//	////int& ra = a;//err
//	//const int& ra = a;
//
//	//int b = 20;
//	//const int& rb = b;
//	////rb++;//err
//	//b++;
//	//cout << b << " " << rb << endl;
//	
//	char a = 'x';
//	char& ra = a;
//	char* za = &a;
//	cout << sizeof(ra) << " " << sizeof(za);
//	return 0;
//}
//void Swap(int& rx, int& ry)
//{
//	int tmp = rx;
//	rx = ry;
//	ry = tmp;
//} 
//int main()
//{
//	int x = 0, y = 1;
//	cout << x << " " << y << endl;
//	Swap(x, y);
//	cout << x << " " << y << endl;
//	return 0;
//}
//int main()
//{
//	int a = 0;
//	// 引⽤：b和c是a的别名
//	//int& x;//err 引用必须初始化
//	int& b = a;
//	//int& c = a;
//	// 也可以给别名b取别名，d相当于还是a的别名
//	/*int& d = b;
//	++d;*/
//	int c = 20;
//	b = c;//这里是赋值
//
//	// 这⾥取地址我们看到是⼀样的
//	cout << &a <<" "<<a << endl;
//	cout << &b <<b<<" "<< endl;
//	cout << &c << " " << c << endl;
//	/*cout << &c <<c<< endl;
//	cout << &d <<d<< endl;*/
//	return 0;
//}
//int main()
//{
//	ios_base::sync_with_stdio(false);
//	cin.tie(nullptr);
//	cout.tie(nullptr);
//	int a = 0;
//	double b = 0.1;
//	char c = 'x';
//	cout << a << " " << b << " " << c << endl;
//	std::cout << a << " " << b << " " << c << std::endl;
//	/*scanf("%d%lf", &a, &b);
//	printf("%d %lf\n", a, b);*/
//	// 可以⾃动识别变量的类型
//	/*cin >> a;
//	cin >> b >> c;
//	cout << a << endl;
//	cout << b << " " << c << endl;*/
//	return 0;
//}
//int rand = 10;
//int main()
//{
//	std::cout << rand << std::endl;
//	return 0;
//}

//class Date
//{
//public :
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	} 
//	// 编译报错：error C2652 : “Date”: ⾮法的复制构造函数: 第⼀个参数不应是“Date”
//		//Date(Date d)
//		Date(const Date & d)
//		{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	} 
//		Date(Date* d)
//	{
//		_year = d->_year;
//		_month = d->_month;
//		_day = d->_day;
//	} 
//		void Print()
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//void Func1(Date d)
//{
//	cout << &d << endl;
//	d.Print();
//} 
//// Date Func2()
//Date & Func2()
//{
//	Date tmp(2024, 7, 5);
//	tmp.Print();
//	return tmp;
//} 
//int main()
//{
//	Date d1(2024, 7, 5);
//	// C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造，所以这⾥传值传参要调⽤拷⻉构造
//	// 所以这⾥的d1传值传参给d要调⽤拷⻉构造完成拷⻉，传引⽤传参可以较少这⾥的拷⻉
//	Func1(d1);
//	cout << &d1 << endl;
//	// 这⾥可以完成拷⻉，但是不是拷⻉构造，只是⼀个普通的构造
//	Date d2(&d1);
//	d1.Print();
//	d2.Print();
//	//这样写才是拷⻉构造，通过同类型的对象初始化构造，⽽不是指针
//	Date d3(d1);
//	d2.Print();
//	// 也可以这样写，这⾥也是拷⻉构造
//	Date d4 = d1;
//	d2.Print();
//	// Func2返回了⼀个局部对象tmp的引⽤作为返回值
//	// Func2函数结束，tmp对象就销毁了，相当于了⼀个野引⽤
//	Date ret = Func2();
//	ret.Print();
//	return 0;
//}
//class A
//{
//public :
//	void Print()
//	{
//		cout << "A::Print()" << endl;
//		//cout << _a << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	A* p = nullptr;
//	p->Print();
//	return 0;
//}
// 计算⼀下A/B/C实例化的对象是多⼤？
//class A
//{
//public :
//	void Print()
//	{
//		cout << _ch << endl;
//	}
//private:
//	char _ch;//1 8 1
//	int _i;//4 8 4
//};
//class B
//{
//public :
//	void Print()
//	{
//		//...
//	}
//};
//class C
//{};
//int main()
//{
//	A a;
//	B b;
//	C c;
//	cout << sizeof(a) << endl;//8
//	cout << sizeof(b) << endl;//1
//	cout << sizeof(c) << endl;//1
//	return 0;
//}